package conservare.modelo.boleto;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import conservare.listener.AuditoriaListener;
import conservare.modelo.Auditavel;
import conservare.modelo.Auditoria;
import conservare.modelo.Endereco;
import conservare.modelo.Pessoa;
import conservare.modelo.banco.Conta;
import conservare.modelo.financeiro.ContaAReceber;

@Entity
@Table(name="tb_boleto_emitido")
@EntityListeners(AuditoriaListener.class)
public class BoletoEmitido implements Serializable, Auditavel{
	
	private static final long serialVersionUID = -8603482021939757987L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="boleto_emitido_id")
	private Integer id;
	
	@Column(name="dt_documento")
	@Temporal(TemporalType.DATE)
	private Date dataDoDocumento;
	
	@Column(name="vlr_documento")
	private BigDecimal valorDoDocumento = new BigDecimal(0.0);
	
	@Column(name="dt_vencimento")
	@Temporal(TemporalType.DATE)
	private Date dataDoVencimento;
	
	@Column(name="vlr_multa_apos_venc")
	private BigDecimal valorMulta = new BigDecimal(0.0);
	
	@Column(name="vlr_juros_mora")
	private BigDecimal valorJurosMora = new BigDecimal(0.0);
	
	@Column(name="numero_documento")
	private Integer numeroDoDocumento;
	
	@Column(name="nosso_numero")
	private String nossoNumero;
	
	@ManyToOne(targetEntity=ContaAReceber.class)
	@JoinColumn(name="conta_arec_id")
	private ContaAReceber contaAReceber;
	
	@ManyToOne
	@JoinColumn(name="conta_bancaria_id")
	private Conta contaBancaria;
	
	
	@ManyToOne(targetEntity=Pessoa.class)
	@JoinColumn(name="pagador_id")
	private Pessoa pagador;
	
	@Embedded
	private Auditoria auditoria;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Date getDataDoDocumento() {
		return dataDoDocumento;
	}

	public void setDataDoDocumento(Date dataDoDocumento) {
		this.dataDoDocumento = dataDoDocumento;
	}

	public BigDecimal getValorDoDocumento() {
		return valorDoDocumento;
	}

	public void setValorDoDocumento(BigDecimal valorDoDocumento) {
		this.valorDoDocumento = valorDoDocumento;
	}

	public Date getDataDoVencimento() {
		return dataDoVencimento;
	}

	public void setDataDoVencimento(Date dataDoVencimento) {
		this.dataDoVencimento = dataDoVencimento;
	}

	public BigDecimal getValorMulta() {
		return valorMulta;
	}

	public void setValorMulta(BigDecimal valorMulta) {
		this.valorMulta = valorMulta;
	}

	public BigDecimal getValorJurosMora() {
		return valorJurosMora;
	}

	public void setValorJurosMora(BigDecimal valorJurosMora) {
		this.valorJurosMora = valorJurosMora;
	}

	public Integer getNumeroDoDocumento() {
		return numeroDoDocumento;
	}

	public void setNumeroDoDocumento(Integer numeroDoDocumento) {
		this.numeroDoDocumento = numeroDoDocumento;
	}

	public String getNossoNumero() {
		return nossoNumero;
	}

	public void setNossoNumero(String nossoNumero) {
		this.nossoNumero = nossoNumero;
	}

	public ContaAReceber getContaAReceber() {
		return contaAReceber;
	}

	public void setContaAReceber(ContaAReceber contaAReceber) {
		this.contaAReceber = contaAReceber;
	}

	public Conta getContaBancaria() {
		return contaBancaria;
	}

	public void setContaBancaria(Conta contaBancaria) {
		this.contaBancaria = contaBancaria;
	}

	public String getNomeCedente(){
		return getContaBancaria().getEmpresa().getNome();
	}
	
	public String getNumeroCpfCnpjCedente(){
		return getContaBancaria().getEmpresa().getCpfCnpj().getNumero();
	}

	public String getNomeDoSacado(){
		return getContaAReceber().getContrato().getLocalPrestacaoServico().getNome();
	}
	
	public Endereco getEnderecoDoSacado(){
		return getContaAReceber().getContrato().getLocalPrestacaoServico().getEndereco();
	}
	
	public String getNomeDoSacadorAvalista(){
		return getContaAReceber().getContrato().getContratante().getNome();
	}
	
	public String getNumeroCpfCnpjDoSacadorAvalista(){
		return getContaAReceber().getContrato().getContratante().getCpfCnpj().getNumero();
	}
	
	public Endereco getEnderecoDoSacadorAvalista(){
		return getContaAReceber().getContrato().getContratante().getEndereco();
	}
	
	public Pessoa getPagador() {
		return pagador;
	}

	public void setPagador(Pessoa pagador) {
		this.pagador = pagador;
	}

	public Auditoria getAuditoria() {
		return auditoria;
	}

	public void setAuditoria(Auditoria auditoria) {
		this.auditoria = auditoria;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		BoletoEmitido other = (BoletoEmitido) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

	
	
}
